package com.tzt.emas;

import java.util.Date;

import com.tzt.util.GetCacheUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.push.model.v20160801.PushRequest;
import com.aliyuncs.push.model.v20160801.PushResponse;
import com.aliyuncs.utils.ParameterHelper;
import com.tzt.contents.Constantpool;
import com.tzt.contents.ErrorCodeConstant;
import com.tzt.exception.InnerException;

@Service
public class EmasService
{
    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    private static final String accessKeyId = "LTAIABnToQ0U9IKN";

    private static final String accessKeySecret = "YNERqHlm4bvtqEPnZndovXufnrqEBd";

    private static final Long androidAppKey = 24920137L;

    private static final Long iosAppKey = 24931701L;

    @Autowired
    private GetCacheUtil getCacheUtil;

    public static void main(String[] args)
    {
        try
        {
            //PushResponse push = push("67d769a4fce03ab4", "2", "标题", "这是一个信息");
        }
        catch (Exception e)
        {

        }

    }

    /**
     *
     * @param alias ：推送别名
     * @param type ：类型（1:IOS 2:android）
     * @param title ：推送标题
     * @param bodyMsg ：推送信息（Json格式）
     */
    public PushResponse push(String alias, String type, String title, String bodyMsg) throws InnerException
    {
        logger.info("阿里信息推送 alias:" + alias + "<==>type:" + type + "<==>title:" + title + "<==>bodyMsg:" + bodyMsg);
        IClientProfile profile = DefaultProfile.getProfile(Constantpool.ALIPAY_DEFAULT_REGIONID, getCacheUtil.getDictValueByKey(Constantpool.EMAS_ACCESSKEYID_KEY),
                getCacheUtil.getDictValueByKey(Constantpool.EMAS_ACCESSKEYSECRET_KEY));
        DefaultAcsClient client = new DefaultAcsClient(profile);
        PushRequest pushRequest = new PushRequest();
        // 推送目标
        if (Constantpool.IOS_ALIPAY_PUSH_TYPE.equals(type))
        {
            pushRequest.setAppKey(Long.valueOf(getCacheUtil.getDictValueByKey(Constantpool.EMAS_IOSAPPKEY_KEY)));
        }
        else if (Constantpool.ANDROID_ALIPAY_PUSH_TYPE.equals(type))
        {
            pushRequest.setAppKey(Long.valueOf(getCacheUtil.getDictValueByKey(Constantpool.EMAS_ANDROIDAPPKEY_KEY)));
        }
        pushRequest.setTarget("ALIAS"); // 推送目标: DEVICE:按设备推送 ALIAS : 按别名推送
        // ACCOUNT:按帐号推送 TAG:按标签推送; ALL: 广播推送
        pushRequest.setTargetValue(alias); // 根据Target来设定，如Target=DEVICE, 则对应的值为
        // 设备id1,设备id2.
        // 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
        // pushRequest.setTarget("ALL"); //推送目标: DEVICE:推送给设备;
        // ACCOUNT:推送给指定帐号,TAG:推送给自定义标签; ALL: 推送给全部
        // pushRequest.setTargetValue("ALL"); //根据Target来设定，如Target=DEVICE,
        // 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
        pushRequest.setPushType("MESSAGE"); // 消息类型 MESSAGE NOTICE
        pushRequest.setDeviceType("ALL"); // 设备类型 ANDROID iOS ALL.
        // 推送配置
        pushRequest.setTitle(title); // 消息的标题
        pushRequest.setBody(bodyMsg); // 消息的内容
        // 推送配置: iOS
        // pushRequest.setIOSBadge(5); // iOS应用图标右上角角标
        // pushRequest.setIOSMusic("default"); // iOS通知声音
        // pushRequest.setIOSSubtitle("iOS10 subtitle");//iOS10通知副标题的内容
        // pushRequest.setIOSNotificationCategory("iOS10 Notification
        // Category");//指定iOS10通知Category
        // pushRequest.setIOSMutableContent(true);//是否允许扩展iOS通知内容
        // pushRequest.setIOSApnsEnv("DEV");//iOS的通知是通过APNs中心来发送的，需要填写对应的环境信息。"DEV"
        // : 表示开发环境 "PRODUCT" : 表示生产环境
        // pushRequest.setIOSRemind(true); //
        // 消息推送时设备不在线（既与移动推送的服务端的长连接通道不通），则这条推送会做为通知，通过苹果的APNs通道送达一次。注意：离线消息转通知仅适用于生产环境
        // pushRequest.setIOSRemindBody("iOSRemindBody");//iOS消息转通知时使用的iOS通知内容，仅当iOSApnsEnv=PRODUCT
        // && iOSRemind为true时有效
        // pushRequest.setIOSExtParameters("{\"_ENV_\":\"DEV\",\"k2\":\"v2\"}");
        // //通知的扩展属性(注意 : 该参数要以json map的格式传入,否则会解析出错)
        // 推送配置: Android
        // pushRequest.setAndroidNotifyType("NONE");//通知的提醒方式 "VIBRATE" : 震动
        // "SOUND" : 声音 "BOTH" : 声音和震动 NONE : 静音
        // pushRequest.setAndroidNotificationBarType(1);//通知栏自定义样式0-100
        // pushRequest.setAndroidNotificationBarPriority(1);//通知栏自定义样式0-100
        // pushRequest.setAndroidOpenType("NONE"); //点击通知后动作 "APPLICATION" :
        // 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
        // pushRequest.setAndroidOpenUrl("http://www.aliyun.com");
        // //Android收到推送后打开对应的url,仅当AndroidOpenType="URL"有效
        // pushRequest.setAndroidActivity("com.alibaba.push2.demo.XiaoMiPushActivity");
        // // 设定通知打开的activity，仅当AndroidOpenType="Activity"有效
        // pushRequest.setAndroidMusic("default"); // Android通知音乐
        // pushRequest.setAndroidPopupActivity("com.ali.demo.PopupActivity");//设置该参数后启动辅助弹窗功能,
        // 此处指定通知点击后跳转的Activity（辅助弹窗的前提条件：1. 集成第三方辅助通道；2. StoreOffline参数设为true）
        // pushRequest.setAndroidPopupTitle("Popup Title");
        // pushRequest.setAndroidPopupBody("Popup Body");
        // pushRequest.setAndroidExtParameters("{\"k1\":\"android\",\"k2\":\"v2\"}");
        // //设定通知的扩展属性。(注意 : 该参数要以 json map 的格式传入,否则会解析出错)
        // 推送控制
        /*
         * Date pushDate = new Date(System.currentTimeMillis()) ; // 30秒之间的时间点,
         * 也可以设置成你指定固定时间 String pushTime =
         * ParameterHelper.getISO8601Time(pushDate);
         * pushRequest.setPushTime(pushTime);
         */ // 延后推送。可选，如果不设置表示立即推送
        String expireTime = ParameterHelper.getISO8601Time(new Date(System.currentTimeMillis() + 12 * 3600 * 1000)); // 12小时后消息失效,
        // 不会再发送
        pushRequest.setExpireTime(expireTime);
        pushRequest.setStoreOffline(true); // 离线消息是否保存,若保存,
        // 在推送时候，用户即使不在线，下一次上线则会收到
        try
        {
            long startTime = System.currentTimeMillis();
            PushResponse pushResponse = client.getAcsResponse(pushRequest);
            long endTime = System.currentTimeMillis();
            logger.info("调用API 花费时间(单位：毫秒)：" + (endTime - startTime));
            logger.info("RequestId:" + pushResponse.getRequestId() + ", MessageID:" + pushResponse.getMessageId());
            return  pushResponse;
        }
        catch (Exception e)
        {
            logger.info("阿里信息推送失败！" +e.getMessage());
            e.printStackTrace();
            throw new InnerException(ErrorCodeConstant.FAILED, "阿里信息推送失败！");
        }

    }
}
